from lxml import etree

text = """
<div>
  <ul>
    <li class="item-0"><a href="link1.html">first item</a></li>
    <li class="item-1"><a href="link2.html">second item</a></li>
    <li class="item-inactive"><a href="link3.html">third item</a></li>
    <li class="item-1"><a href="link4.html">fourth item</a></li>
    <li class="item-0"><a href="link5.html">fifth item</a></li>
  </ul>
</div>
"""

"""
  示例1 获取所有节点
  这里使用 * 代表匹配所有节点，也就是整个 HTML 文本中的所有节点都会被获取。可以看到，返回形式是一个列表，每个元素是 Element 类型，其后跟了节点的名称，如 html、body、div、ul、li、a 等，所有节点都包含在列表中了。
"""
# html = etree.HTML(text)
# result = html.xpath("//*")
# print(result)


"""
  示例1 获取所有节点li
  
"""
# html = etree.HTML(text)
# result = html.xpath("//li")
# print(result)
# print(result[0]) # 输出第一个li


"""
  示例2  选择 li 节点的所有直接子节点 a
  因为 //li 用于选中所有 li 节点，/a 用于选中 li 节点的所有直接子节点 a，二者组合在一起即获取所有 li 节点的所有直接子节点 a
  
注意/ 和//的区别
/	从当前节点选取直接"儿子"节点
//	从当前节点选取"子孙"节点

"""
html = etree.HTML(text)
result = html.xpath("//li/a")
print(result)


"""
  示例3 获取父节点  ../
  假如我们知道了子节点，怎样来查找父节点呢？ 这可以用 .. 来实现
  比如，现在首先选中 href 属性为 link4.html 的 a 节点，然后获取其父节点，再获取其 class 属性 
"""
html = etree.HTML(text)
result = html.xpath("//a[@href='link4.html']/../@class")
print(result) # ['item-1']


"""
  示例4 获取父节点   也可以通过 parent:: 来获取父节点
"""
html = etree.HTML(text)
result = html.xpath("//a[@href='link4.html']/parent::*/@class")
print(result) # ['item-1']

